// 通道（Channel）是一种用于在 goroutine 之间传递数据的机制。通道可以是无缓冲的（unbuffered）或有缓冲的（buffered）。

// 通道的缓冲机制

//无缓冲通道
//无缓冲通道要求发送和接收操作同时发生。这意味着，当一个 goroutine 尝试发送数据到无缓冲通道时，它将被阻塞，直到另一个 goroutine 尝试从该通道接收数据为止。
//同样，当一个 goroutine 尝试从无缓冲通道接收数据时，它将被阻塞，直到另一个 goroutine 尝试发送数据为止。

// 有缓冲通道
// 有缓冲通道允许发送和接收操作在不同时发生。发送操作将数据存储到缓冲区中，只要缓冲区未满，发送操作就不会被阻塞。同样，只要缓冲区中有数据，接收操作就不会被阻塞。缓冲区的大小在创建通道时指定。
package main

import "fmt"

func main() {

	// 创建一个String类型的缓冲通道，设置缓冲大小为2
	messages := make(chan string, 2)

	// 因为它是有缓冲通道，我们可以把2个值放到通道中，不需要并发的接收
	messages <- "buffered"
	messages <- "channel"

	// 可以通过 <-的方式接收通道中的值
	fmt.Println(<-messages)
	fmt.Println(<-messages)
}
